<?php

/**
 * 
 * Classe com regras genéricas
 * @author fabio.oshiro
 *
 */
class RegrasBase{
	/**
	 * Verifica se existe height ou width com tamanho fixo
	 * 
	 * @return true caso haja tamanho fixo
	 */
	public function verificaTamFixoAtributoWidhtHeight($tagInteira) {
		$w = $this->getAtributo($tagInteira, "width");
		$h = $this->getAtributo($tagInteira, "height");
		// System.out.print("h='"+h+"' w='"+w+"'\n");
		if ($w == "" && $h == "") {
			// n�o possui width nem height ent�o ok
			return false;
		}
		if (strpos($w, '%') === false && $w != "") {
			// valor sem %
			return true;
		}
		if (strpos($h,"%") === false && $h != "") {
			// valor sem %
			return true;
		}
		return false;
	}

	/**
	 * Verifica se a extens&atilde;o do src 
	 * &eacute; .gif O ideal no futuro seria baixar a imagem e
	 * pegar o content type
	 * 
	 * @param tagInteira
	 * @return true caso no final seja gif
	 */
	public function verificaIsGif($tagInteira) {
		if (substr($this->getAtributo(strtolower($tagInteira),"src"),-4) == ".gif") {
			return true;
		}
		return false;
	}

	/**
	 * Verifica se h� um longdesc
	 * 
	 * @param tagInteira
	 * @return true caso tenha um long desc
	 */
	public function verificaLongDesc($tagInteira) {
		$longdesc = $this->getAtributo(strtolower($tagInteira), "longdesc");
		if ($longdesc == "") {
			return false;
		}
		return true;
	}

	/**
	 * Verifica se possui um atributo style
	 * 
	 * @param tagInteira
	 * @return true caso tenha algun style
	 */
	public function verificaPossuiStyle($tagInteira) {
		$style = $this->getAtributo($tagInteira, "style");
		if ($style == "") {
			return false;
		}
		return true;
	}

	/**
	 * Verifica se h� algum parametro de cor
	 * 
	 * @param tagInteira
	 * @return true caso haja parametro de cor
	 */
	public function verificaCorStyleInline($tagInteira) {
		$style = $this->getAtributo($tagInteira, "style");
		if (strpos($style,"color") !== false) {
			return true;
		} else if (strpos($style, "background") !== false) {
			return true;
		}
		return false;
	}

	/**
	 * Verifica se a tag link &eacute; de css
	 * 
	 * @param tagInteira
	 * @return true caso seja link de CSS
	 */
	public function verificaIsCSS($tagInteira) {
		$rel = $this->getAtributo($tagInteira, "rel");
		if ($rel == "stylesheet") {
			return true;
		}
		$tipo = $this->getAtributo($tagInteira, "type");
		if ($tipo == "text/css") {
			return true;
		}
		return false;
	}

	/**
	 * Verifica se est� na lista de Deprecated ou Non Standard
	 * 
	 * @param tagName
	 * @return
	 */
	public function verificaDeprecatedNonStandard($tagName) {
		/*
		 * Colocado desta forma para poder descrever a tag
		 */
		if ($tagName == "blink") {
			/*
			 * Non standard Netscape
			 */
			return false;
		} else if ($tagName == "basefont") {
			/*
			 * ?
			 */
			return false;
		} else if ($tagName == "font") {
			// Deprecated
			return false;
		} else if ($tagName == "u") {
			// Deprecated
			return false;
		} else if ($tagName == "applet") {
			// Deprecated
			return false;
		} else if ($tagName == "menu") {
			// Deprecated
			return false;
		} else if ($tagName == "center") {
			// Deprecated
			return false;
		} else if ($tagName == "s") {
			// Deprecated
			return false;
		} else if ($tagName == "strike") {
			// Deprecated
			return false;
		} else if ($tagName == "embed") {
			/*
			 * Non standard Netscape
			 */
			return false;
		} else if ($tagName == "noembed") {
			/*
			 * Non standard Netscape
			 */
			return false;
		} else if ($tagName == "spacer") {
			/*
			 * The <spacer> tag places an empty space, of the specified size,
			 * into document. Non standard
			 */
			return false;
		} else if ($tagName == "ilayer") {
			/*
			 * Non standard Netscape
			 */
			return false;
		} else if ($tagName == "nolayer") {
			/*
			 * Non standard Netscape
			 */
			return false;
		} else if ($tagName == "keygen") {
			/*
			 * Non standard Netscape
			 */
			return false;
		} else if ($tagName == "spacer") {
			/*
			 * Non standard Netscape
			 */
			return false;
		} else if ($tagName == "comment") {
			/*
			 * Non standard Microsoft
			 */
			return false;
		} else if ($tagName == "bgsound") {
			/*
			 * Non standard Microsoft
			 */
			return false;
		} else if ($tagName == "marquee") {
			/*
			 * Non standard Microsoft
			 */
			return false;
		} else if ($tagName == "wbr") {
			/*
			 * Non standard Netscape
			 */
			return false;
		} else if ($tagName == "nobr") {
			/*
			 * Non standard Netscape
			 */
			return false;
		} else if ($tagName == "blink") {
			/*
			 * Non standard
			 */
			return false;
		} else if ($tagName == "servlet") {
			/*
			 * Non standard SUN
			 */
			return false;
		} else if ($tagName == "nolayer") {
			/*
			 * N�o standard
			 */
			return false;
		} else if ($tagName == "align") {
			/*
			 * N�o standard
			 */
			return false;
		} else if ($tagName == "ilayer") {
			/*
			 * N�o standard
			 */
			return false;
		} else if ($tagName == "nosave") {
			/*
			 * Non standard
			 */
			return false;
		} else if ($tagName == "multicol") {
			/*
			 * Non standard
			 */
			return false;
		} else if ($tagName == "listing") {
			/*
			 * Is an ancient tag which was intended to indicate a long
			 * unformatted list. Deprecated
			 */
			return false;
		} else if ($tagName == "dir") {
			/*
			 * Deprecated Tipo de lista
			 */
			return false;
		} else if ($tagName == "isindex") {
			/*
			 * Deprecated em favor do elemento input
			 */
			return false;
		}
		return true;
	}

	/**
	 * Verifica se existe uma tag noscript no c�digo html
	 * @param codHTML
	 * @return
	 */
	public function verificaNoscript($codHTML) {
		if(stripos($codHTML, "<noscript>")!==false) return true;
		if(stripos($codHTML, "<noscript ")!==false) return true;
		return false;
	}

	/**
	 * Verifica se a tag possui o stributo lang
	 * 
	 * @param tag
	 * @return true caso haja uma lang
	 */
	public function verificaLang($tag) {
		$lang = $this->getAtributo($tag, "lang");
		if ($lang == "") {
			return false;
		}
		return true;
	}

	/**
	 * Verifica se existe texto dentro das tags object
	 * 
	 * @param codHTML
	 * @param tag
	 * @param tagIndex int
	 *            in�cio de onde come�a a tag no c�digo html
	 * @return true caso exista texto predefinido
	 */
	public function verificarTextoEmObject($codHTML, $tag, $tagIndex) {
		$ini = $tagIndex + strlen($tag);
		$objects = 1;
		preg_match_all("/<\/?object[^>]*>/", strtolower(substr($codHTML, $ini)), $matches, PREG_OFFSET_CAPTURE | PREG_SET_ORDER);
		foreach ($matches as $val) {
			$abreOuFecha = $val[0][0];
			if (substr($abreOuFecha, 0, 7) === "<object") {
				$objects++;
			} else {
				$objects--;
			}
			// verifica se fechou todas as tags que abriram <object
			if ($objects == 0) {
				$fim = $ini + $val[0][1];
				if ($fim >= $ini) {
					$conteudo = substr($codHTML,$ini, $fim - $ini);
					preg_match_all("/<[^>]>|\s/", $conteudo, $ma, PREG_SET_ORDER);
					foreach($ma as $m){
						$subConteudo=$m[0][0];
						if(substr($subConteudo,0,4)=="<img"){
							$alt=$this->getAtributo($subConteudo,"alt");
							if($alt != ""){
								return true;
							}
						}
					}
					$conteudo = preg_replace("/<[^>]>|\s/","",$conteudo);
					if ($conteudo == "") {
						return false;
					} else {
						return true;
					}
				} else {
					return false;
				}
			}
		}
		return false;
	}
	
	/**
	 * Verifica se existe texto na tag iframe
	 * 
	 * @param codHTML
	 * @param tag
	 * @param tagIndex
	 *            in�cio de onde come�a a tag no c�digo html
	 * @return true caso exista texto dentro de iframe
	 */
	public function verificaTextoIframe($codHTML, $tag, $tagIndex) {
		if($this->getTextInside($codHTML, $tag, $tagIndex, "</iframe")==""){
			return false;
		}
		return true;
	}
	
	public function verificarCliqueAqui($codHTML, $tag, $tagIndex){
		$in = trim(strtolower($this->getTextInside($codHTML, $tag, $tagIndex, "</a>")));
		$in = str_replace(array('.',',','[',']','(',')'),'',$in);
		//echo '||' . str_replace('<', '&lt;', $in) . '||<br>';
		if($in == "clique aqui") return false;
		if($in == "saiba mais") return false;
		if($in == "confira") return false;
		return true;
	}
	
	private function getTextInside($codHTML, $tag, $tagIndex, $endTag){
		$ini = $tagIndex + strlen($tag);
		$fim = stripos($codHTML, $endTag, $ini);
		if ($fim !== false) {
			return substr($codHTML, $ini, $fim-$ini);
		}
		return "";
	}
	
	/**
	 * Verifica se existe texto predefinido para a tag area
	 * 
	 * @param codHTML
	 * @param tag
	 * @param tagIndex
	 *            in�cio de onde come�a a tag no c�digo html
	 * @return true caso exista texto predefinido
	 */
	public function verificaTextoPredefinidoTextarea($codHTML, $tag, $tagIndex) {
		if($this->getTextInside($codHTML, $tag, $tagIndex, "</textarea")==""){
			return false;
		}
		return true;
	}

	/**
	 * Verifica se a tag html tem um label associado Input text Input (text
	 * default) Input password Input checkbox Input radio Input file textarea
	 * (sem type) select (sem type)
	 * 
	 * @param codHTML
	 * @param idField
	 * @return true caso esteja com label associado ou n�o precise
	 */
	public function verificaLabelTag($codHTML, $tag) {
		$tipo = $this->getAtributo($tag, "type");
		$retorno = true;
		// Se for textarea ou select o type � igual a ""
		if ($tipo == "text" || $tipo == "password" || $tipo == "" || $tipo == "checkbox" || $tipo == "radio" || $tipo == "file") {
			$id_campo = $this->getAtributo($tag, "id");
			if ($id_campo != "") {
				$retorno = $this->verificaLabel($codHTML, $id_campo);
			} else {
				// n�o possui id
				$retorno = false;
			}
		}
		return $retorno;
	}

	/**
	 * Verifica se o idField tem um label associado em todo html
	 * 
	 * @param codHTML
	 * @param idField
	 * @return true caso exista
	 */
	public function verificaLabel($codHTML, $idField) {
		return preg_match("/<label\s[^>]*for=\"" . $idField . "\"[^>]*>/", $codHTML) === 1;
	}

	/**
	 * Verifica se campos de texto possuem caracteres predefinidos aplicado em
	 * text e password
	 * 
	 * @param codHTML
	 * @return true caso a tag esteja Ok
	 */
	public function verificaTextoPredefinidoInput($tagInput) {
		// Regex
		$tipo = strtolower($this->getAtributo($tagInput, "type"));
		if ($tipo != "text" && $tipo != "password" && $tipo != "") {
			// N�o � para verificar, a tag est� ok
			return true;
		}
		$value = $this->getAtributo($tagInput, "value");
		if($value == ""){
			//value em branco, n�o passou no teste
			return false;
		}
		return true;
	}

	/**
	 * Verifica se a tag tem algum parametro indicando tamanho fixo Hoje n�o vai
	 * at� um arquivo CSS separado
	 * 
	 * @param tag
	 * @return true caso esteja ok
	 */
	public function verificaTamFixoEmAtributoStyle($tag) {
		$estilo = $this->getAtributo($tag, 'style');
		// Texto onde procurar o regex
		if ($estilo == '') {
			// N�o possui estilo, ent�o est� ok
			return true;
		}
		/*
		 * Verificando tamanho de fonte
		 */
		$tuplas = explode(';', $estilo);
		$i=0;
		foreach ($tuplas as $t){
			$t = trim($t);
			$ini = strpos($t, ':');
			if($ini!==false){
				$k = trim(substr($t, 0, $ini));
				$v = trim(substr($t, $ini));
				if($k == 'font' || $k == 'font-size'){
					if(strpos($v, 'px') !== false) return false;
					if(strpos($v, 'pt') !== false) return false;
					if(strpos($v, 'ex') !== false) return false;
					if(strpos($v, 'pc') !== false) return false;
					if(strpos($v, 'mm') !== false) return false;
					if(strpos($v, 'cm') !== false) return false;
					if(strpos($v, 'in') !== false) return false;
				}else if($k == 'width' || $k == 'height'){
					if(strpos($v, '%') === false && strpos($v, 'em') === false) return false;
				}
			}
		}
		return true;
	}

	/**
	 * Retorna o atributo especificado caso n�o tenha retorna ""
	 * 
	 * @param tagInteira
	 *            &lt;img src="foto.jpg" alt="teste"&gt;
	 * @param att
	 *            Ex alt, longdesc, etc
	 * @return
	 */
	public function getAtributo($tagInteira, $att) {
		$iDquote = 0;
		$iSquote = 0;
		$atributo = '';
		$valor = '';
		$tot = strlen($tagInteira)-1;
		$att = strtolower($att);
		if($tot>1 && $tagInteira[$tot-1]=='/') $tot--;
		for($i=0;$i<$tot;$i++){
			$c = $tagInteira[$i];
			if($c==' ' || $c=="\t" || $c=="\n" || $c=="\r"){//primeiro espaco
				for($i++;$i<$tot;$i++){
					$c = $tagInteira[$i];
					if($c!=' ' && $c!="\t" && $c!="\n" && $c!="\r" && $c!='=' && $c!='"' && $c!="'"){
						$atributo.=$c;
					}else{
						if($atributo!=='' && $c=='='){
							//pegar o valor
							for($i++;$i<$tot;$i++){
								$c = $tagInteira[$i];
								$end = ' ';
								if($c=='"' || $c=="'"){
									$end = $c;
								}else{
									$valor .= $c;
								}
								for($i++;$i<$tot;$i++){
									$c = $tagInteira[$i];
									if($end != $c){
										$valor .= $c;
									}else{
										break;
									}
								}
								break;
							}
						}
						if(strtolower($atributo) == $att){
							return $valor;
						}
						$atributo='';
						$valor='';
					}
				}		
			}
		}
		return "";
	}

}
